#ifndef __MM_H_
#define __MM_H_
#include <types.h>
#include <list.h>

#define PAGE_SIZE 4096
#define PAGE_SHIFT 12
#define PAGE_MASK (~(0xfff))
#define PAGE_MAGIC  0x44AA
#define BLOCK_MAGIC 0x33AA
/**
 * @brief PAGE_ENTRY
 * 获取一个页的首地址
 */
#define PAGE_ENTRY(page) (page & PAGE_MASK)
/**
 * @brief PAGE_FRON
 * 获取一个页的前一个页
 */
#define PAGE_FRON(page) ((page & PAGE_MASK) - PAGE_SIZE)
/**
 * @brief 计算一共多少个页
 * 
 * @param _start 
 * @param _end 
 */
#define PAGE_COUNT(_start, _end) ((uint32_t)(PAGE_ENTRY(_end) - PAGE_ENTRY(_start))>>PAGE_SHIFT)
/**
 * @brief 
 * 动态内存的类别
 */
enum {
    kernel_region,
    user_region,
    region_count,
};
/**
 * @brief 
 * 动态内存相关接口
 */
#define MEM_CHECK(_start, addr, _end) (addr < _end && addr > _start)
#define user_mem_init(start, end)   dmem_init(user_region, start, end)
#define kernel_mem_init(start, end)   dmem_init(kernel_region, start, end)
void dmem_init(uint32_t index, mem_t start, mem_t end);
void kmem_mannager_init(void);
void* kmalloc(uint32_t size);
void free(void *ptr);
#endif